package com.ljy.my_study.leetcode.简化路径;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author lijunying
 * @date 2021/9/18 9:27
 */
public class TestMain {

//    给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。
//
//    在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。
//
//    请注意，返回的 规范路径 必须遵循下述格式：
//
//    始终以斜杠 '/' 开头。
//    两个目录名之间必须只有一个斜杠 '/' 。
//    最后一个目录名（如果存在）不能 以 '/' 结尾。
//    此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
//    返回简化后得到的 规范路径 。
//
//             
//
//    示例 1：
//
//    输入：path = "/home/"
//    输出："/home"
//    解释：注意，最后一个目录名后面没有斜杠。
//    示例 2：
//
//    输入：path = "/../"
//    输出："/"
//    解释：从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。
//    示例 3：
//
//    输入：path = "/home//foo/"
//    输出："/home/foo"
//    解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。
//    示例 4：
//
//    输入：path = "/a/./b/../../c/"
//    输出："/c"
//             
//
//    提示：
//
//            1 <= path.length <= 3000
//    path 由英文字母，数字，'.'，'/' 或 '_' 组成。
//    path 是一个有效的 Unix 风格绝对路径。
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/simplify-path
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        System.out.println(new TestMain().simplifyPath("/bb/../bb/,,,/.../11/../../../aa"));
    }

    public String simplifyPath(String path) {
        int len=path.length();
        if(len<=1){
            return "/";
        }
        Deque<String> deque=new LinkedList<>();
        int left=-1;
        for(int i=1;i<len;i++){
            if(path.charAt(i-1)=='/') {
                if (path.charAt(i) == '/') {
                    continue;
                }
                left = i;
            }
            if(path.charAt(i)=='/'){
                String sub=path.substring(left,i);
                handleDeque(deque,sub);
            }else if(i+1==len){
                String sub=path.substring(left,len);
                handleDeque(deque,sub);
            }
        }
        if(deque.isEmpty()){
            return "/";
        }
        StringBuilder sb=new StringBuilder();
        for(String sub:deque){
            sb.append("/"+sub);
        }
        return sb.toString();
    }

    private void handleDeque(Deque<String> deque,String sub){
        if(".".equals(sub)){
            return;
        }else if("..".equals(sub)){
            if(!deque.isEmpty()){
                deque.pollLast();
                return;
            }
        }else{
            deque.addLast(sub);
        }
    }
}
